﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Galaktika.BI.Silverlight.Intermediate;
using Galaktika.BI.Charting;

namespace Galaktika.BI.Charting.PivotChart
{
    public class ChartProperties
    {
        /// <summary>
        /// Флаг внутреннего обновления значений. 
        /// </summary>
        private bool m_InternalUpdating = false;

        public ChartProperties()
        {
            m_InternalUpdating = true;

            //Устанавливаем настройки по-умолчанию
            SetDefaultSettings();

            m_InternalUpdating = false;
            //RaisePropertyChanged();
        }

        /// <summary>
        /// Устанавливает настройки по-умолчанию
        /// </summary>
        public void SetDefaultSettings()
        {
            Caption = String.Empty;
            CaptionColor = Colors.Black;
            CaptionFont = new Font();
            CaptionFont.Size = 12;

            BackColor = Colors.White;
            Opacity = 1;
            ChartType = ChartType.Line;
            ShowValues = true;

            Use3D = false;
            Depth3D = 5;
            ValueIndent = 0;
            FormatString = String.Empty;
            UseLegend = true;
            LegendLocation = new Point(0, 0);
            LegendDock = LegendDockStyle.TopLeft;
            LegendFont = new Font();
            LegendFont.Size = 12;
            UseLegendInvert = false;

            IsFilterMode = false;
            SeriesIndices = string.Empty;
            DataIndices = string.Empty;
            UseZooming = false;
            PaletteName = String.Empty;
            FontColor = Colors.Transparent;
        }

        /// <summary>
        /// Событие - произошло изменение свойств
        /// </summary>
        public event EventHandler PropertyChanged;

        #region Свойства для заголовка диаграммы

        private string m_Caption = String.Empty;
        /// <summary>
        /// Определяет заголовок для всей диаграммы
        /// </summary>
        public string Caption
        {
            get { return m_Caption; }
            set
            {
                m_Caption = value;
                RaisePropertyChanged();
            }
        }

        private Color m_CaptionColor = Colors.Black;
        /// <summary>
        /// Цвет заголовка диаграммы
        /// </summary>
        public Color CaptionColor
        {
            get
            {
                return this.m_CaptionColor;
            }
            set
            {
                this.m_CaptionColor = value;
                RaisePropertyChanged();
            }
        }

        private Font m_CaptionFont = new Font();
        /// <summary>
        /// Шрифт заголовка диаграммы
        /// </summary>
        public Font CaptionFont
        {
            get
            {
                return this.m_CaptionFont;
            }
            set
            {
                if (value != null)
                    this.m_CaptionFont = value;
                RaisePropertyChanged();
            }
        }
        #endregion Свойства для заголовка диаграммы

        #region Свойства для настройки отображения самой диаграммы
        private Color m_BackColor;
        /// <summary>
        /// Цвет фона для всей диаграммы
        /// </summary>
        public Color BackColor
        {
            get
            {
                return m_BackColor;
            }
            set
            {
                m_BackColor = value;
                RaisePropertyChanged();
            }
        }

        private double m_Opacity;
        /// <summary>
        /// Прозрачность
        /// </summary>
        public double Opacity
        {
            get
            {
                return m_Opacity;
            }
            set
            {
                m_Opacity = value;
                RaisePropertyChanged();
            }
        }

        private ChartType m_ChartType;
        /// <summary>
        /// Тип диаграммы
        /// </summary>
        public ChartType ChartType
        {
            get
            {
                return m_ChartType;
            }
            set
            {
                m_ChartType = value;
                RaisePropertyChanged();
            }
        }

        private bool m_ShowValues;
        /// <summary>
        /// Управляет необходимостью отображения значений
        /// </summary>
        public bool ShowValues
        {
            get
            {
                return m_ShowValues;
            }
            set
            {
                m_ShowValues = value;
                RaisePropertyChanged();
            }
        }

        private int m_ValueIndent;
        /// <summary>
        /// Задает отступ для значения на графике (положительное - за пределами графика, отрицательное - внутри графика)
        /// </summary>
        public int ValueIndent
        {
            get
            {
                return m_ValueIndent;
            }
            set
            {
                m_ValueIndent = value;
                RaisePropertyChanged();
            }
        }

        private String m_FormatString;
        /// <summary>
        /// Формат значений на графике. 
        /// </summary>
        public String FormatString
        {
            get
            {
                return m_FormatString;
            }
            set
            {
                m_FormatString = value;
                RaisePropertyChanged();
            }
        }
        #endregion Свойства для настройки отображения самой диаграммы

        #region Свойства для настройки на данные
        public object m_DataSource;
        /// <summary>
        /// Источник данных
        /// </summary>
        public object DataSource
        {
            get
            {
                return m_DataSource;
            }
            set
            {
                m_DataSource = value;
                RaisePropertyChanged();
            }
        }
        #endregion Свойства для настройки на данные

        #region Управление 3D
        private bool m_Use3D;
        /// <summary>
        /// Вкл/Выкл отображения 3D изображения на графике
        /// </summary>
        public virtual bool Use3D
        {
            get
            {
                return m_Use3D;
            }
            set
            {
                m_Use3D = value;
                RaisePropertyChanged();
            }
        }

        private int m_Depth3D;
        /// <summary>
        /// Глубина объемности графика
        /// </summary>
        public virtual int Depth3D
        {
            get
            {
                return m_Depth3D;
            }
            set
            {
                m_Depth3D = value;
                RaisePropertyChanged();
            }
        }
        #endregion Управление 3D

        #region Управление легендой
        private bool m_UseLegend;
        /// <summary>
        /// Вкл/Выкл отображения легенды на диаграмме
        /// </summary>
        public bool UseLegend
        {
            get
            {
                return m_UseLegend;
            }
            set
            {
                m_UseLegend = value;
                RaisePropertyChanged();
            }
        }

        private Point m_LegendLocation;
        /// <summary>
        /// Устанавливает позицию легенды
        /// </summary>
        public Point LegendLocation
        {
            get
            {
                return m_LegendLocation;
            }
            set
            {
                m_LegendLocation = value;
                RaisePropertyChanged();
            }
        }

        private LegendDockStyle m_LegendDock;
        /// <summary>
        /// Определяет привязку легенды к углу
        /// </summary>
        public LegendDockStyle LegendDock
        {
            get
            {
                return m_LegendDock;
            }
            set
            {
                m_LegendDock = value;
                RaisePropertyChanged();
            }
        }

        private Font m_LegendFont;
        /// <summary>
        /// Шрифт для легенды
        /// </summary>
        public Font LegendFont
        {
            get
            {
                return this.m_LegendFont;
            }
            set
            {
                if (value != null)
                    this.m_LegendFont = value;
                RaisePropertyChanged();
            }
        }

        private bool m_UseLegendInvert;
        /// <summary>
        /// True – элементы в легенде будут располагаться вертикально False - элементы в легенде будут располагаться горизонтально
        /// </summary>
        public bool UseLegendInvert
        {
            get
            {
                return m_UseLegendInvert;
            }
            set
            {
                m_UseLegendInvert = value;
                RaisePropertyChanged();
            }
        }
        #endregion Управление легендой

        private bool m_IsFilterMode;
        /// <summary>
        /// Признак работы в режиме фильтрации
        /// </summary>
        public bool IsFilterMode
        {
            get
            {
                return m_IsFilterMode;
            }
            set
            {
                m_IsFilterMode = value;
                RaisePropertyChanged();
            }
        }

        private string m_SeriesIndices;
        /// <summary>
        /// Массив допустимых индексов серий (столбцов источника).
        /// </summary>
        public string SeriesIndices
        {
            get
            {
                return m_SeriesIndices;
            }
            set
            {
                m_SeriesIndices = value;
                RaisePropertyChanged();
            }
        }

        private string m_DataIndices;
        /// <summary>
        /// Массив допустимых индексов данных (строк источника).
        /// </summary>
        public string DataIndices
        {
            get
            {
                return m_DataIndices;
            }
            set
            {
                m_DataIndices = value;
                RaisePropertyChanged();
            }
        }

        private bool m_UseZooming;
        /// <summary>
        /// Признак использования масштабирования
        /// </summary>
        public bool UseZooming
        {
            get
            {
                return m_UseZooming;
            }
            set
            {
                m_UseZooming = value;
                RaisePropertyChanged();
            }
        }

        private string m_PaletteName;
        /// <summary>
        /// Название используемой палитры
        /// </summary>
        public string PaletteName
        {
            get
            {
                return m_PaletteName;
            }
            set
            {
                m_PaletteName = value;
                RaisePropertyChanged();
            }
        }

        private string m_PaletteSource;
        /// <summary>
        /// Источник палитры (имя чарта DevExpress из этой же формы).
        /// </summary>
        public string PaletteSource
        {
            get
            {
                return m_PaletteSource;
            }
            set
            {
                m_PaletteSource = value;
                RaisePropertyChanged();
            }
        }

        private Color m_FontColor;
        /// <summary>
        /// Цвет шрифта
        /// </summary>
        public Color FontColor
        {
            get
            {
                return m_FontColor;
            }
            set
            {
                m_FontColor = value;
                RaisePropertyChanged();
            }
        }

        private void RaisePropertyChanged()
        {
            //В случае внутреннего обновления значений событие не генерируем
            if (m_InternalUpdating)
                return;

            EventHandler handler = PropertyChanged;
            if (handler != null)
                handler(this, EventArgs.Empty);
        }

        /// <summary>
        /// Возвращает цвет, полученный из исходного с учетом заданной прозрачности
        /// </summary>
        /// <param name="color">Исходный цвет</param>
        /// <param name="opacity">Прозрачность (0-1)</param>
        /// <returns>Прозрачный цвет</returns>
        public static Color GetOpacityColor(Color color, double opacity)
        {
            if (color == Colors.Transparent)
                return Colors.Transparent;
            double newOpacity = Math.Max(0, Math.Min(1, opacity));
            int alpha = (int)Math.Round(255 * newOpacity);

            Color opacityColor = Color.FromArgb((byte)alpha, color.R, color.G, color.B);
            return opacityColor;
        }
    }

}
